﻿using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using AudiPyme.BLL;
using System.IO;
using System.Data;
using AudiPyme.DAL;

namespace AudiPyme.UI
{
    public partial class AdTblNewCriterio : System.Web.UI.Page
    {
        //Estructura que sirve para recoger los criterios de riesgo seleccionados en la interfaz
        public struct CriterioRiesgoCheck
        {
            int idCriterioRiesgo;
            bool check;

            public int IdCriterioRiesgo
            {
                get { return idCriterioRiesgo; }
                set { idCriterioRiesgo = value; }
            }


            public bool Check
            {
                get { return check; }
                set { check = value; }
            }

            public CriterioRiesgoCheck(int IdCriterioRiesgo, bool Check)
            {
                idCriterioRiesgo = IdCriterioRiesgo;
                check = Check;
            }
        }

        //Estructura que sirve para formatear los criterios de riesgos seleccionados en la interfaz
        public struct CriterioRiesgoTabla
        {
            int idCriterioRiesgo;
            String codigo;
            String criterioRiesgo;
            String descripcion;

            public int IdCriterioRiesgo
            {
                get { return idCriterioRiesgo; }
                set { idCriterioRiesgo = value; }
            }

            public String Codigo
            {
                get { return codigo; }
                set { codigo = value; }
            }

            public String CriterioRiesgo
            {
                get { return criterioRiesgo; }
                set { criterioRiesgo = value; }
            }

            public String Descripcion
            {
                get { return descripcion; }
                set { descripcion = value; }
            }

            public CriterioRiesgoTabla(int IdCriterioRiesgo, String Codigo, String CriterioRiesgo, String Descripcion)
            {
                idCriterioRiesgo = IdCriterioRiesgo;
                codigo = Codigo;
                criterioRiesgo = CriterioRiesgo;
                descripcion = Descripcion;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //Creamos la estructura para almacenar los elementos elegidos en el gridview
                //Número de controles seleccionados actualmente
                int nControlesOn = 0;
                //Numero de controles que hay actualmente en la BD
                ModeloContainer agenteBD = new ModeloContainer();
                int numCrit = CriteriosRiesgoFactory.NumeroCriterios();
                List<int> Contador = new List<int>(numCrit);
                //Inicializamos la estructura
                for (int i = 0; i < Contador.Capacity; i++)
                {
                    Contador.Insert(i, 0);
                }
                //Inicializamos la estructura que va a almacenar los estados de las amenazas
                List<CriterioRiesgoCheck> CheckList = new List<CriterioRiesgoCheck>(numCrit);
                //Guardamos en variables de sesión
                Session["CheckList"] = CheckList;
                Session["nControlesOn"] = nControlesOn;
            }
        }

        protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
        {
            try
            {
                String c = args.Value;
                bool estaCodigo = false;
                estaCodigo = CriteriosRiesgoFactory.EstaCodigo(c);
                if (estaCodigo)
                {
                    args.IsValid = false;
                }
                else
                {
                    args.IsValid = true;
                }
            }
            catch (Exception e)
            {
                MuestraMensaje("Error.El Criterio no pudo ser insertado. " + e.Message);
                args.IsValid = false;
            }
        }

        protected void BtnInsertar_Click(object sender, EventArgs e)
        {
            Page.Validate("ValidarFormulario");
            if (Page.IsValid)
            {
                try
                {
                    String Codigo = TxtCodigo.Text;
                    String CR = TxtCriterioRiesgo.Text;
                    String Descrip = TxtDescripcion.Text;
                    CriteriosRiesgoFactory.InsertarCriteriosRiesgo(Codigo, CR, Descrip);
                    MuestraMensajeRedirige("El Criterio de Riesgo ha sido Insertado Correctamente");
                }
                catch (Exception e1)
                {
                    e1.ToString();
                    MuestraMensaje("Error al insertar el criterio de riesgo");
                }
            }
            else
            {
                MuestraMensaje("El Criterio de Riesgo no pudo ser Insertado");
            }
        }

        //Método que se ejecuta al evento de cliquear uno de los checkbox de cualquier elemento de la tabla
        protected void CheckBox_Changued(Object sender, EventArgs e)
        {
            try
            {
                //Recuperamos las variables de sesión
                //Recogemos el valor de los elementos seleccionados en las otras paginas del GridView
                //con la variable de sesión nControlesOn
                int nControlesOn = (int)Session["nControlesOn"];
                List<CriterioRiesgoCheck> CheckList = (List<CriterioRiesgoCheck>)Session["Checklist"];
                //Recorremos la página que el gridview muestra
                foreach (GridViewRow row in GVCritRiesg.Rows)
                {
                    //Recogemos el control CheckBox de cada fila del gridview
                    CheckBox Chk = (CheckBox)row.FindControl("CheckBox1");
                    //Recogemos el Id de Criterio de Riesgo de cada fila
                    int IdCriterioRiesgo;
                    int.TryParse(GVCritRiesg.Rows[row.RowIndex].Cells[0].Text, out IdCriterioRiesgo);
                    //Si es la primera vez que se elige este elemento, aumentamos el contador
                    //y marcamos que ese elemento ya está elegido
                    if (Chk.Checked == true && !EstaRelacion(CheckList, IdCriterioRiesgo))
                    {
                        if (nControlesOn == 0)
                        {
                            BtnRestaurar.Enabled = true;
                        }
                        CheckList.Add(new CriterioRiesgoCheck(IdCriterioRiesgo, true));
                        nControlesOn++;
                    }
                    //Sino marcamos que la relación no está elegida y actualizamos estructuras
                    else if (Chk.Checked == false && EstaRelacion(CheckList, IdCriterioRiesgo))
                    {
                        //Eliminamos las ocurrencias guardadas anteriormente de la relación
                        for (int i = 0; i < CheckList.Count(); i++)
                        {
                            if (CheckList[i].IdCriterioRiesgo == IdCriterioRiesgo)
                            {
                                CheckList.RemoveAt(i);
                            }
                        }

                        nControlesOn--;
                        if (nControlesOn == 0)
                        {
                            BtnRestaurar.Enabled = false;
                        }
                    }
                }
                //Si estamos en la opción de Relaciones Seleccionadas, actualizamos el gridview
                String OpcionFiltro = RblFiltro.SelectedValue;
                if (OpcionFiltro.Equals("RelacSelec"))
                {
                    GridViewRelacionesSeleccionadas();
                }
                //Actualizamos el número de controles elegidos en el label
                LblControl.Text = nControlesOn.ToString();
                //Guardamos en la variable de sesión
                Session["CheckList"] = CheckList;
                Session["nControlesOn"] = nControlesOn;
            }
            catch (Exception e1)
            {
                MuestraMensaje("Error al hacer click en el elemento de la tabla");
                e1.ToString();
            }
        }


        protected void GVCritRiesg_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
                //Recogemos el array tipado con el valor de los elementos que han sido elegidos
                List<CriterioRiesgoCheck> CheckList = (List<CriterioRiesgoCheck>)Session["Checklist"];
                //Recorremos el Gridview antes de cambiar de página
                foreach (GridViewRow row in GVCritRiesg.Rows)
                {
                    //Recogemos el control CheckBox de cada fila
                    CheckBox Chk = (CheckBox)row.FindControl("CheckBox1");
                    //Si está seleccionado
                    if (Chk.Checked == true)
                    {
                        //Recogemos el IdCriterioRiesgo de la fila
                        int IdCriterioRiesgo;
                        int.TryParse(GVCritRiesg.Rows[row.RowIndex].Cells[0].Text, out IdCriterioRiesgo);
                    }
                    //Si no está seleccionado
                    if (Chk.Checked == false)
                    {
                        //Recogemos el IdCriterioRiesgo de la fila
                        int IdCriterioRiesgo;
                        int.TryParse(GVCritRiesg.Rows[row.RowIndex].Cells[0].Text, out IdCriterioRiesgo);
                        //Actualizamos el valor de contador
                        if (EstaRelacion(CheckList, IdCriterioRiesgo))
                        {
                            //Creamos una instancia y lo eliminamos de la lista
                            int indice = IndiceRelacion(CheckList, IdCriterioRiesgo);
                            CheckList.RemoveAt(indice);
                        }
                    }
                }
                //Actualizamos la variable de sesión
                this.GVCritRiesg.PageIndex = e.NewPageIndex;
                Session["CheckList"] = CheckList;
                String OpcionFiltro = RblFiltro.SelectedValue;
                if (OpcionFiltro.Equals("RelacSelec"))
                {
                    GridViewRelacionesSeleccionadas();
                }
                else
                {
                    String TextoBuscar = TxtFiltro.Text;
                    LlenaGridView(OpcionFiltro, TextoBuscar);
                    ActualizaCheckListTabla();
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar la tabla con los elementos seleccionados");
            }
        }

        private void GridViewRelacionesSeleccionadas()
        {
            try
            {
                ModeloContainer agenteBD = new ModeloContainer();
                //Recogemos el array tipado con el valor de los elementos que han sido elegidos
                List<CriterioRiesgoCheck> CheckList = (List<CriterioRiesgoCheck>)Session["Checklist"];
                List<CriterioRiesgoTabla> LRelacionesSelec = new List<CriterioRiesgoTabla>();
                //Cargamos el valor de los elementos que estuvieran seleccionados anteriormente
                for (int i = 0; i < CheckList.Count(); i++)
                {
                    if (CheckList[i].Check == true)
                    {
                        CriterioRiesgoTabla nuevaFila = new CriterioRiesgoTabla();
                        nuevaFila.IdCriterioRiesgo = CheckList[i].IdCriterioRiesgo;
                        nuevaFila.Codigo = CriteriosRiesgoFactory.CodigoCriterioRiesgo(CheckList[i].IdCriterioRiesgo);
                        nuevaFila.CriterioRiesgo = CriteriosRiesgoFactory.NombreCriterioRiesgo(CheckList[i].IdCriterioRiesgo);
                        nuevaFila.Descripcion = CriteriosRiesgoFactory.DescripcionCriterioRiesgo(CheckList[i].IdCriterioRiesgo);
                        LRelacionesSelec.Add(nuevaFila);
                    }
                }
                GVCritRiesg.DataSource = LRelacionesSelec;
                DataBind();
                ActualizaCheckListTabla();
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar la tabla con los elementos seleccionados");
            }
        }

        private bool EstaRelacion(List<CriterioRiesgoCheck> CheckList, int IdCriterioRiesgo)
        {
            for (int i = 0; i < CheckList.Count(); i++)
            {
                if (CheckList[i].IdCriterioRiesgo == IdCriterioRiesgo)
                {
                    return true;
                }
            }
            return false;
        }

        private int IndiceRelacion(List<CriterioRiesgoCheck> CheckList, int IdCriterioRiesgo)
        {
            for (int i = 0; i < CheckList.Count(); i++)
            {
                if (CheckList[i].IdCriterioRiesgo == IdCriterioRiesgo)
                {
                    return i;
                }
            }
            return -1;
        }

        protected void BtnRestaurar_Click(object sender, EventArgs e)
        {
            try
            {
                ModeloContainer agenteBD = new ModeloContainer();
                List<CriterioRiesgoCheck> CheckList = (List<CriterioRiesgoCheck>)Session["Checklist"];
                List<int> LCriterioRiesgo = new List<int>();
                foreach (CriterioRiesgoCheck Crit in CheckList)
                {
                    LCriterioRiesgo.Add(Crit.IdCriterioRiesgo);
                }
                CriteriosRiesgoFactory.RestauraCriterioRiesgo(LCriterioRiesgo);
                MuestraMensajeRedirige("Criterio de Riesgo y su conocimiento asociado restaurados correctamente");
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al restaurar la base de conocimiento");
            }
        }

        private void MuestraMensajeRedirige(string Mensaje)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            SB.Append("var vers = navigator.appVersion;if(vers.indexOf('MSIE 7.0') != -1) { window.location='AdTblNewCriterio.aspx';} else{ window.location='AdTblNewCriterio.aspx'; }");
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Success", SB.ToString(), true);
        }

        protected void RblFiltro_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (RblFiltro.SelectedValue.Equals("RelacSelec"))
            {
                TxtFiltro.Visible = false;
                BtnBuscar.Visible = false;
                GridViewRelacionesSeleccionadas();
            }
            else
            {
                TxtFiltro.Visible = true;
                BtnBuscar.Visible = true;
                //Limpiamos el TextBox ya que venimos de otra opción
                TxtFiltro.Text = "";
                String OpcionFiltro = RblFiltro.SelectedValue;
                String TextoBuscar = TxtFiltro.Text;
                LlenaGridView(OpcionFiltro, TextoBuscar);
                ActualizaCheckListTabla();
            }
        }

        protected void BtnBuscar_Click(object sender, EventArgs e)
        {
            String OpcionFiltro = RblFiltro.SelectedValue;
            String TextoBuscar = TxtFiltro.Text;
            LlenaGridView(OpcionFiltro, TextoBuscar);
            ActualizaCheckListTabla();
        }

        private void ActualizaCheckListTabla()
        {
            try
            {
                //Recogemos el array tipado con el valor de los elementos que han sido elegidos
                List<CriterioRiesgoCheck> CheckList = (List<CriterioRiesgoCheck>)Session["Checklist"];
                //Cargamos el valor de los elementos que estuvieran seleccionados anteriormente
                for (int i = 0; i < CheckList.Count(); i++)
                {
                    foreach (GridViewRow row in GVCritRiesg.Rows)
                    {
                        int IdTipoAmenaza;
                        int.TryParse(GVCritRiesg.Rows[row.RowIndex].Cells[0].Text, out IdTipoAmenaza);
                        if (IdTipoAmenaza == CheckList[i].IdCriterioRiesgo)
                        {
                            CheckBox Chk = (CheckBox)row.FindControl("CheckBox1");
                            if (CheckList[i].Check)
                            {
                                Chk.Checked = true;
                            }
                            else
                            {
                                Chk.Checked = false;
                            }
                        }
                    }
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al mostrar los elementos seleccionados");
            }
        }

        private void MuestraMensaje(string Mensaje)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Success", SB.ToString(), true);
        }

        private void LlenaGridView(String OpcionFiltro, String TextoBuscar)
        {
            try
            {
                List<CriteriosRiesgo> LCriterios = new List<CriteriosRiesgo>();
                ModeloContainer agenteBD = new ModeloContainer();
                OpcionFiltro = RblFiltro.SelectedValue;
                TextoBuscar = TxtFiltro.Text;
                //Sacamos los criterios borrados de la base de conocimiento
                //Si no se ha introducido texto de búsqueda, sacamos todas los criterios seleccionados
                if (TextoBuscar.Equals("") || OpcionFiltro.Equals(""))
                {
                    LCriterios = CriteriosRiesgoFactory.RecogeCriteriosEliminados();
                    GVCritRiesg.DataSource = LCriterios;
                    DataBind();
                }
                else
                {
                    switch (OpcionFiltro)
                    {
                        case "CriterioRiesgo":
                            //Criterio de Riesgo con el Filtro de Criterio de Riesgo 
                            LCriterios = CriteriosRiesgoFactory.RecogeCriteriosEliminadosPorCriterio(TextoBuscar);
                            break;
                        case "Codigo":
                            //Criterio de Riesgo con el Filtro de Codigo
                            LCriterios = CriteriosRiesgoFactory.RecogeCriteriosEliminadosPorCodigo(TextoBuscar);
                            break;
                        default:
                            MuestraMensaje("No se recogio la opción de Filtro elegida");
                            break;
                    }

                    if (LCriterios.Count() == 0)
                    {
                        MuestraMensaje("No se encontraron elementos con " + OpcionFiltro + " que contuvieran la secuencia " + TextoBuscar);
                    }
                    else
                    {
                        GVCritRiesg.DataSource = LCriterios;
                        DataBind();
                    }
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al actualizar los datos en la tabla");
            }
        }


        //Evento que indica si el checkbox de Criterios de Riesgo Eliminados está activado o no
        //Cambian la visibilidad de paneles según como esté marcado
        protected void ChkBorrado_CheckedChanged(object sender, EventArgs e)
        {
            if (ChkBorrado.Checked == true)
            {
                PnlGV.Visible = true;
                PnlDdl.Visible = false;
                String OpcionFiltro = RblFiltro.SelectedValue;
                String TextoBuscar = TxtFiltro.Text;
                if (OpcionFiltro.Equals("RelacSelec"))
                {
                    GridViewRelacionesSeleccionadas();
                }
                else
                {
                    LlenaGridView(OpcionFiltro, TextoBuscar);
                }
                ActualizaCheckListTabla();
            }
            else
            {
                PnlGV.Visible = false;
                PnlDdl.Visible = true;
            }
        }
    }
}